﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using System.Text;
using BLL.Services;

namespace BLL.IServices
{
    public class UserService : IUserService
    {
        public MsgReturn AddUser(QLBH_User user, List<int> rights)
        {
            using (var context = new QLBHEntities())
            {
                try
                {
                    context.Configuration.AutoDetectChangesEnabled = false;
                    if (context.QLBH_User.Any(o => o.UserName == user.UserName))
                    {
                        return MsgReturn.TransferMsg(false, "UserName đã có người sử dụng rồi!");
                    }
                    if (context.QLBH_User.Any(o => o.Email == user.Email))
                    {
                        return MsgReturn.TransferMsg(false, "Email đã có người sử dụng rồi!");
                    }

                    context.QLBH_User.Add(user);
                    context.SaveChanges();
                    if (rights.Any())
                    {
                        foreach (var right in rights)
                        {
                            var user_role = new QLBH_UserRole
                            {
                                RoleID = right,
                                UserID = user.UserID
                            };
                            context.QLBH_UserRole.Add(user_role);
                        }
                        context.SaveChanges();
                    }
                    return MsgReturn.TransferMsg(true, "Thêm người dùng thành công!");
                }
                catch (Exception)
                {
                    return MsgReturn.TransferMsg(false, "Có lỗi xảy ra!");
                }
                finally
                {
                    context.Configuration.AutoDetectChangesEnabled = true;
                }
            }          
        }

        public MsgReturn UpdateUser(QLBH_User updatedUser, List<int> rights)
        {
            using (var context = new QLBHEntities())
            {
                try
                {
                    if (context.QLBH_User.Any(o => o.UserID != updatedUser.UserID && o.Email == updatedUser.Email))
                    {
                        return MsgReturn.TransferMsg(false, "Email đã có người sử dụng rồi!");
                    }

                    var user = context.QLBH_User.Find(updatedUser.UserID);
                    user.FullName = updatedUser.FullName;
                    user.Phone = updatedUser.Phone;
                    user.Email = updatedUser.Email;
                    user.ExtraInfo = updatedUser.ExtraInfo;
                    context.QLBH_UserRole.RemoveRange(context.QLBH_UserRole.Where(o => o.UserID == updatedUser.UserID));
                    if (rights.Any())
                    {
                        foreach (var right in rights)
                        {
                            var user_role = new QLBH_UserRole
                            {
                                RoleID = right,
                                UserID = updatedUser.UserID
                            };
                            context.QLBH_UserRole.Add(user_role);
                        }
                        
                    }
                    context.SaveChanges();

                    return  MsgReturn.TransferMsg(true, "Sửa người dùng thành công!");
                }
                catch (Exception)
                {
                    return MsgReturn.TransferMsg(false, "Có lỗi xảy ra!");  
                }
            }
        }

        public MsgReturn UpdateUserStatus(int userId)
        {
            using (var context = new QLBHEntities())
            {
                try
                {
                    var user = context.QLBH_User.Find(userId);
                    user.Status = user.Status == 1 ? 0 : 1;
                    context.SaveChanges();
                    return MsgReturn.TransferMsg(true, "Sửa trạng thái người dùng thành công!");
                }
                catch (Exception)
                {
                    return MsgReturn.TransferMsg(false, "Có lỗi xảy ra!");
                }
                
            }
        }

        public IEnumerable<QLBH_User> GetAllUsers()
        {
            try
            {
                var context = new QLBHEntities();
                return context.QLBH_User;
            }
            catch (Exception)
            {
                return null;
            }
        }

        public QLBH_User GetUserById(int userid,out List<int> rights)
        {
            using(var context = new QLBHEntities())
            {
                try
                {
                    rights = context.QLBH_UserRole.Where(o => o.UserID == userid).Select(o => o.RoleID).ToList();
                    return context.QLBH_User.Find(userid);
                }
                catch (Exception)
                {
                    rights = new List<int>();
                    return null;
                }
            }
        }
    }
}
